// JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数... 这一切都会占用内存。
// JS中主要的内存管理概念是 可达性。
// JS 引擎中有一个被称作 垃圾回收器 的东西在后台执行。它监控着所有对象的状态，并删掉那些已经不可达的。

// *******************************************************************************************************

// 可达性：
// 这里列出固有的可达值的基本集合，这些值明显不能被释放。比方说：
// 1. 当前执行的函数，它的局部变量和参数。
// 2. 当前嵌套调用链上的其他函数，它们的局部变量和参数。
// 3. 全局变量。
// 这些值被称为“根”。

// *******************************************************************************************************

// 简单的例子:
// 现在全局变量 user 指向（引用）了对象 { name: 'John' } 表示该对象是可达的，不会被回收。
let user = { name: 'John' }
// 现在我们将 user 变量重新赋值为 null，表示 { name: 'John' } 该对象不再可达，因为没有了引用，垃圾回收器会认为它是垃圾数据并进行回收，释放内存。
user = null

// *******************************************************************************************************

// 两个引用
let o1 = { name: 'John' }
let o2 = o1

o1 = null
console.log(o2.name) // John o2 任然可达，所以 { name: 'John' } 不会被回收。

// *******************************************************************************************************

// 总结：
// 1. 垃圾回收是自动完成的，我们不能强制执行或是阻止执行。
// 2. 当对象是可达状态时，它一定是存在于内存中的。
// 3. 被引用与可访问不同（从一根），一组相互连接的对象可能整体都不可达。
